import { ContactGender, DateType, OssImageOptions, OssResourceType, WeekdayEng } from './type'
import { AggregatedStatus } from '@/service/api/modules/groupon/response'

/**
 * 格式化多类型时间
 * @param time 时间戳或者时间对象
 * @param type 时间类型
 */
export const formatDateTime = ((time: number | string | Date, type: DateType): string => {
  if (!time) return ''
  const date = time instanceof Date ? time : new Date(time)
  const y = date.getFullYear()
  const m = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
  const d = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  const h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  const minute = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  const second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  switch (type) {
    case 'yy-mm-dd hh:mm:ss':
      return `${y}-${m}-${d} ${h}:${minute}:${second}`
    case 'yy-mm-dd type':
      return `${y}-${m}-${d} ${h === 13 ? '下午' : '上午'}`
    case 'yy-mm-dd hh:mm':
      return `${y}-${m}-${d} ${h}:${minute}`
    case 'yy/mm/dd hh:mm:ss':
      return `${y}/${m}/${d} ${h}:${minute}:${second}`
    case 'yy-mm-dd':
      return `${y}-${m}-${d}`
    case 'yy.mm.dd':
      return `${y}.${m}.${d}`
    case 'yy.mm.dd hh:mm':
      return `${y}.${m}.${d} ${h}:${minute}`
    case 'yy.mm.dd hh:mm:ss':
      return `${y}.${m}.${d} ${h}:${minute}:${second}`
    case 'mm-dd hh:mm':
      return `${m}-${d} ${h}:${minute}`
  }
})

/**
 * 格式化时间（日期为今天时省略日期只显示时间），精确到分钟
 * @param time 时间字符串
 */
export const formatTime = (time: number | string | Date): string => {
  if (!time) return ''
  const messageDate = new Date(time)
  const nowDate = new Date()
  const messageTime = {
    year: messageDate.getFullYear(),
    month: messageDate.getMonth() + 1,
    day: messageDate.getDate(),
    hour: messageDate.getHours().toString().padStart(2, '0'),
    min: messageDate.getMinutes().toString().padStart(2, '0'),
    second: messageDate.getSeconds()
  }
  const nowTime = {
    year: nowDate.getFullYear(),
    month: nowDate.getMonth() + 1,
    day: nowDate.getDate()
  }
  if (messageTime.year === nowTime.year && messageTime.month === nowTime.month && messageTime.day === nowTime.day) {
    return `今天 ${messageTime.hour}:${messageTime.min}`
  } else if (messageTime.year === nowTime.year && messageTime.month === nowTime.month && nowTime.day - messageTime.day === 1) {
    return `昨天 ${messageTime.hour}:${messageTime.min}`
  } else if (messageTime.year === nowTime.year) {
    return `${messageTime.month}月${messageTime.day}日 ${messageTime.hour}:${messageTime.min}`
  } else {
    return `${messageTime.year}年${messageTime.month}月${messageTime.day}日 ${messageTime.hour}:${messageTime.min}`
  }
}

/**
 * 格式化Weekday为中文
 * @param weekday weekday（英语单词）
 */
export const formatWeekday = (weekday: WeekdayEng): string => {
  const weekdayMap: { [key: string]: string } = {
    'sunday': '周日',
    'monday': '周一',
    'tuesday': '周二',
    'wednesday': '周三',
    'thursday': '周四',
    'friday': '周五',
    'saturday': '周六'
  }
  return weekdayMap[weekday.toLowerCase()] ?? ''
}

/**
 * 格式化联系人姓名
 * @param contactName 联系人姓名（未格式化的）
 */
export const formatContactName = (contactName: string): string => {
  if (contactName) {
    if (contactName.lastIndexOf('先生') !== contactName.indexOf('先生')) {
      return contactName.replace('{#先生}', '')
    } else if (contactName.lastIndexOf('女士') !== contactName.indexOf('女士')) {
      return contactName.replace('{#女士}', '')
    } else {
      if (contactName.endsWith('{#先生}')) {
        return `${contactName.replace('{#先生}', '')}（先生）`
      } else if (contactName.endsWith('{#女士}')) {
        return `${contactName.replace('{#女士}', '')}（女士）`
      } else {
        return contactName
      }
    }

  } else return ''
}

/**
 * 提取并切割联系人姓名/性别
 * @param contactName 联系人姓名（未格式化的）
 * @return {Array} 返回二维数组，格式：[联系人姓名, 性别代码]
 */
export const getContactGender = (contactName: string): ContactGender => {
  const res: ContactGender = {
    name: contactName,
    gender: 0
  }
  if (contactName.endsWith('{#先生}')) {
    res.name = contactName.replace('{#先生}', '')
    res.gender = 1
  } else if (contactName.endsWith('{#女士}')) {
    res.name = contactName.replace('{#女士}', '')
    res.gender = 2
  }
  return res
}

/**
 * 格式化商品数量显示
 * @param amount 商品数量
 */
export const formatAmount = (amount?: number): string => {
  return typeof amount !== 'number' ? 'x NaN' : `x ${amount}`
}

/**
 * 格式化价格显示
 * @param price 价格
 */
export const formatPrice = (price?: number): string => {
  return typeof price !== 'number' ? '' : `￥${(price / 100.0).toFixed(2)}`
}

/**
 * 格式化店铺评分显示
 * @param score 店铺评分
 */
export const formatScore = (score: number | string): string => {
  const scoreNumber = Number(score)
  return !isNaN(scoreNumber) && scoreNumber > 0 && scoreNumber <= 5 ? `${scoreNumber}分` : '暂无评分'
}

/**
 * 格式化人均消费显示
 * @param perCost 人均消费
 */
export const formatPerCost = (perCost: number | string): string => {
  const perCostNumber = Number(perCost)
  return !isNaN(perCostNumber) && perCostNumber > 0 ? `￥${Math.ceil(perCostNumber / 100)}/人` : ''
}

// 格式化距离显示
export const formatDistance = (distance?: number | string): string => {
  distance = Number(distance)
  if (isNaN(distance)) return ''
  return distance < 1000 ? `${Math.round(distance)}m` : `${(distance / 1000.0).toFixed(1)}km`
}

/**
 * 格式化详细地址（门牌号）
 * @param addressDetail 详细地址（门牌号）
 * @param areaName 行政区域名称数组，长度为3，（格式参考subpages/editAddress中说明）
 * @return {string} 格式化后的详细地址（门牌号），包含行政区域名称
 */
export const formatAddressDetail = (addressDetail: string, areaName?: Array<string | undefined>): string => {
  if (areaName) {
    return areaName.length === 3 ? `${areaName[0]}${areaName[1]}${areaName[2]}${addressDetail}` : ''
  } else return ''
}

/**
 * 格式化未读消息数
 * @param unreadCount 未读消息数
 */
export const formatUnreadCount = (unreadCount: number): string => unreadCount > 99 ? '99+' : unreadCount.toString()

/**
 * 格式化OSS文件存储路径（Options）
 * @param url 文件路径
 * @param options OSS选项
 */
export function formatOssUrl(url: string, options: OssImageOptions): string
/**
 * 格式化OSS文件存储路径（Args）
 * @param url 文件路径
 * @param resourceType OSS来源（aliyun/qiniu）
 * @param width 图片宽度（可选）
 * @param height 图片高度（可选）
 * @param quality 图片压缩品质（可选）
 */
export function formatOssUrl(url: string, quality?: number, width?: number, height?: number, resourceType?: OssResourceType): string
/**
 * 格式化OSS文件存储路径
 * @param url 文件路径
 * @param arg1 图片压缩品质（可选）
 * @param arg2 图片宽度（可选）
 * @param arg3 图片高度（可选）
 * @param arg4 OSS选项/OSS来源 {@see OssResourceType}
 */
export function formatOssUrl(
  url: string,
  arg1?: OssImageOptions | number,
  arg2?: number,
  arg3?: number,
  arg4?: OssResourceType
): string {
  if (!url || !arg1) return ''
  // 使用Options格式化OSS路径
  const formatOssUrlWithOptions = (options: OssImageOptions): string => {
    const optionDefault: OssImageOptions = { resourceType: OssResourceType.QINIU }
    options = Object.assign({}, optionDefault, options)
    if (options.resourceType === OssResourceType.QINIU) return formatOssUrlByQiniu(options)
    return ''
  }

  // 格式化七牛云OSS路径
  const formatOssUrlByQiniu = (options: OssImageOptions): string => {
    let finalUrl = `${url}?imageView2/2`
    options?.width && (finalUrl += `/w/${options.width}`)
    options?.height && (finalUrl += `/h/${options.height}`)
    options?.quality && (finalUrl += `/q/${options.quality}`)
    return finalUrl
  }

  // 格式化阿里云OSS路径
  const formatOssUrlByAliyun = (options: OssImageOptions): string => {
    return ''
  }

  if (typeof arg1 === 'number') {
    // 采用Args配置
    const options: OssImageOptions = {}
    !!arg4 && (options.resourceType = arg4)
    !!arg1 && (options.quality = arg1)
    !!arg2 && (options.width = arg2)
    !!arg3 && (options.height = arg3)
    return formatOssUrlWithOptions(options)
  } else {
    // 采用Options配置
    return formatOssUrlWithOptions(arg1)
  }
}

/**
 * 格式化拼团状态
 * @param aggregatedStatus 聚合状态
 */
export function formatGrouponStatus(aggregatedStatus?: AggregatedStatus) {
  const statusMap: { [key: AggregatedStatus | string]: string } = {
    'NON_PAYMENT': '待付款',
    'WORKING': '待成团',
    'DONE': '拼团成功',
    'EXPIRED': '拼团过期',
    'CANCEL': '拼团取消',
    'REFUNDING': '退款中',
    'REFUNDED': '退款成功',
    'EXCEPTION': '订单异常'
  }
  return statusMap?.[aggregatedStatus ?? ''] ?? ''
}
